home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume90
/
aplictns
/
listplot
/
part02
< prev
next >
Wrap
Internet Message Format
|
1990-08-23
|
58KB
Path: abcfd20.larc.nasa.gov!amiga-request
From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
Subject: v90i243: ListPlot - 2d plotting program, Part02/03
Reply-To: Anthony M. Richardson <amr@dukee.egr.duke.edu>
Newsgroups: comp.sources.amiga
Message-ID: <comp.sources.amiga:v90i243@abcfd20.larc.nasa.gov>
Date: 23 Aug 90 01:03:37 GMT
Approved: tadguy@uunet.UU.NET (Tad Guy)
X-Mail-Submissions-To: amiga@uunet.uu.net
X-Post-Discussions-To: comp.sys.amiga
Submitted-by: Anthony M. Richardson <amr@dukee.egr.duke.edu>
Posting-number: Volume 90, Issue 243
Archive-name: applications/listplot/part02
#!/bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 3)."
# Contents: Csrc/ListPlot.c Csrc/get_args.c docs/ListPlot.uu
# Wrapped by tadguy@abcfd20 on Wed Aug 22 21:03:21 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Csrc/ListPlot.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Csrc/ListPlot.c'\"
else
echo shar: Extracting \"'Csrc/ListPlot.c'\" \(19564 characters\)
sed "s/^X//" >'Csrc/ListPlot.c' <<'END_OF_FILE'
X/*
X * ListPlot.c
X *
X * Yet another plotting filter.
X *
X */
X#include <stdio.h>
X#include <errno.h>
Xextern int errno;
X#include <assert.h>
X#include <string.h>
X#include <ctype.h>
X#include <signal.h>
X#include "datatypes.h"
X
Xvoid ErrorExit();
Xchar *calloc();
X
X/* initializations */
Xchar *Usage[] = {
X "Usage: ListPlot [Options]\n",
X 0
X};
Xchar *Function[] = {
X "Function: Yet another plotting filter. For help, enter \"ListPlot help\".\n\tFor more verbose help, enter \"ListPlot Verbose=on help=all\".\n",
X "\n",
X "\tListPlot supports a number of different devices.\n",
X "\n",
X "\tListPlot reads from stdin and writes to stdout unless input and/or\n",
X "\toutput files are specified on the command line.\n",
X "\tThe program accepts a file of n-tuples. Each tuple consists of\n",
X "\ta sequence of space separated numbers terminated with a newline.\n",
X "\tThe first element of each tuple is assumed to be the independent\n",
X "\tvariable. Each remaining element is plotted against the first to\n",
X "\tproduce n-1 curves.\n",
X "\n",
X "\tListPlot takes a number of command line arguments that may be\n",
X "\tused to control the appearance of the plots.\n",
X "\tFor a list of the arguments enter:\n",
X "\t\tListPlot Help=All.\n",
X "\n",
X "\t'Boolean' values accept values such as true, false,\n",
X "\tyes, no, on, and off. (ex. PlotColor=yes)\n",
X "\n",
X "\t'String' values expect the strings to entered as\n",
X "\tindicated and is case sensitive. (ex. Domain=All)\n",
X "\n",
X "\t'Dbl' values expect real numbers. (ex. AspectRatio=1.0)\n",
X "\n",
X "\t'Interval' values expect a pair of comma separated reals.\n",
X "\t\t(ex. Range=-1.0,3.0)\n",
X "\n",
X "\t'Set' values expect a list of comma separated elements enclosed in\n",
X "\tcurly braces ({}). (ex. LineStyle={MS,MMS,MSmmS})\n",
X "\n",
X "\tThe title and label variables accept strings that include\n",
X "\tthe following control sequences:\n",
X "\t\t#u: move up to superscript position (ended with #d)\n",
X "\t\t#d: move down to subscript position (ended with #u)\n",
X "\t\t#b: backspace to allow overprinting\n",
X "\t\t##: the number symbol\n",
X "\t\t#+: toggle overline mode\n",
X "\t\t#-: toggle underline mode\n",
X "\t\t#gx: Greek letter corresponding to Roman letter x\n",
X "\n",
X 0
X};
X
Xbool GraphicsInProgress = FALSE;
X
X
X/* argument definitions */
X/* GoldenRatio = (1+Sqrt(5))/2 */
X#define GOLDENRATIO 1.6180339887499
X#define ASPECTRATIO 1.0/GOLDENRATIO
Xchar *H_AngularUnit[] = {
X "\t'AngularUnit' specifies the angular unit of measure\n",
X "\tused for polar plots. For angles in radians use\n",
X "\t\tAngularUnit=radians\n",
X (char *)NULL
X};
XVALUE V_AngularUnit;
XARGDEF A_AngularUnit = {
X &V_AngularUnit, /* variable */
X "AngularUnit", /* ID */
X "degrees|radians", /* options */
X "string|string", /* format */
X "degrees", /* default */
X "string", /* Default type */
X H_AngularUnit
X };
Xchar *H_AnnotationScale[] = {
X "\t'AnnotationScale' controls the size of the characters\n",
X "\tused to annotate the axises.\n",
X (char *)NULL
X};
XVALUE V_AnnotationScale;
XARGDEF A_AnnotationScale = {
X &V_AnnotationScale, /* variable */
X "AnnotationScale", /* ID */
X "dbl", /* options */
X "dbl", /* format */
X "0.50", /* default */
X "dbl", /* Default type */
X H_AnnotationScale
X };
Xchar *H_AspectRatio[] = {
X "\t'AspectRatio' controls the relative lengths of the vertical to\n",
X "\thorizontal axes. The default is 1.0/GoldenRatio.\n",
X "\t\tAspectRatio=0.618\n",
X "\tIf set this value overrides the value of 'ViewPort'.\n",
X (char *)NULL
X};
XVALUE V_AspectRatio;
XARGDEF A_AspectRatio = {
X &V_AspectRatio, /* variable */
X "AspectRatio", /* ID */
X "dbl|Automatic", /* options */
X "dbl|string", /* format */
X "0.61803399", /* default */
X "dbl", /* Default type */
X H_AspectRatio
X };
Xchar *H_Boxed[] = {
X "\t'Boxed' adds axes to the edges of the plot.\n",
X "\tIf 'Boxed is given a boolean value then axes are placed on\n",
X "\tall of the edges. If 'Boxed' is given a string consisting\n",
X "\tof one or more of 't','b','r','l' then axes are added to\n",
X "\ttop, bottom, right and left edges respectively.\n",
X (char *)NULL
X};
XVALUE V_Boxed;
XARGDEF A_Boxed = {
X &V_Boxed, /* variable */
X "Boxed", /* ID */
X "boolean|*", /* options */
X "boolean|string", /* format */
X "yes", /* default */
X "boolean", /* Default type */
X H_Boxed
X };
Xchar *H_Domain[] = {
X "\t'Domain' may be used to specify the bounds on the X axis.\n",
X (char *)NULL
X};
XVALUE V_Domain;
XARGDEF A_Domain = {
X &V_Domain, /* variable */
X "Domain", /* ID */
X "interval|All|Automatic", /* options */
X "interval|string|string", /* format */
X "All", /* default */
X "string", /* Default type */
X H_Domain
X };
Xchar *H_Gridding[] = {
X "\t'Gridding' puts a grid on the plot.\n",
X (char *)NULL
X};
XVALUE V_Gridding;
XARGDEF A_Gridding = {
X &V_Gridding, /* variable */
X "Gridding", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "no", /* default */
X "boolean", /* Default type */
X H_Gridding
X };
X
X/* N.B. Help is treated differently than other variables and its
X * arguments should only be of type "string"!
X */
Xchar *H_Help[] = {
X "\t'Help' provides some descriptive text for the user-settable\n",
X "\tplotting variables. If the variable 'Verbose' is set then\n",
X "\tan extended description is provided. To set verbose enter\n",
X "\t\tListPlot Verbose=yes Help=[variable name | All].\n",
X (char *)NULL
X};
XVALUE V_Help;
XARGDEF A_Help = {
X &V_Help, /* variable */
X "Help", /* ID */
X "All|all|*", /* options */
X "string|string|string", /* format */
X "All", /* default */
X "string", /* Default type */
X H_Help
X };
Xchar *H_LabelScale[] = {
X "\t'LabelScale' specifies the relative size of the vertical and\n",
X "\thorizontal axis labels. The typical range is [0.5 - 2.0].\n",
X (char *)NULL
X};
XVALUE V_LabelScale;
XARGDEF A_LabelScale = {
X &V_LabelScale, /* variable */
X "LabelScale", /* ID */
X "dbl", /* options */
X "dbl", /* format */
X "0.85", /* default*/
X "dbl", /* Default type */
X H_LabelScale
X };
Xchar *H_LineColor[] = {
X "\t'LineColor' may be used to specify a list of line colors for\n",
X "\tplots with multiple curves if this feature is supported for\n",
X "\ta particular output device.\n",
X (char *)NULL
X};
XVALUE V_LineColor;
XARGDEF A_LineColor = {
X &V_LineColor, /* variable */
X "LineColor", /* ID */
X "set", /* options */
X "set", /* format */
X "{Black,Red,Green,Blue,Yellow}", /* default*/
X "set", /* Default type */
X H_LineColor
X };
Xchar *H_LineStyle[] = {
X "\t'LineStyle' may be used to specify a list of line styles for\n",
X "\tplots with multiple curves. Each linestyle is specified as\n",
X "\ta sequence of pen down... pen up elements. The elements are encoded\n",
X "\tusing the following characters to indicate element lengths:\n",
X "\t\t'm':\t250 micron mark\n",
X "\t\t'M':\t4 m's or a 1mm mark\n",
X "\t\t's':\t250 micron space\n",
X "\t\t'S':\t4 s's or a 1mm space\n",
X "\n",
X "\tFor example, a set of line styles might be indicated\n",
X "\t\tLineStyle={MS,MMSS,MMSmmS,mmS,mmSmmSMMS}\n",
X (char *)NULL
X};
XVALUE V_LineStyle;
XARGDEF A_LineStyle = {
X &V_LineStyle, /* variable */
X "LineStyle", /* ID */
X "set", /* options */
X "set", /* format */
X "{MS,MMSS,MMSmmS,mmS,mmSmmSMMS}",/*default*/
X "set", /* Default type */
X H_LineStyle
X };
Xchar *H_Origin[] = {
X "\tThe 'Origin' option is not yet implemented. It is intended\n",
X "\tthat this feature beused to specify the origin of the plot.\n",
X (char *)NULL
X};
XVALUE V_Origin;
XARGDEF A_Origin = {
X &V_Origin, /* variable */
X "Origin", /* ID */
X "interval|Automatic|Median", /* options */
X "interval|string|string", /* format */
X "Automatic", /* default */
X "string", /* Default type */
X H_Origin
X };
Xchar *H_PlotColor[] = {
X "\t'PlotColor' if TRUE causes the plot to generated in color if this\n",
X "\tfeature is supported on a particular output device.\n",
X (char *)NULL
X};
XVALUE V_PlotColor;
XARGDEF A_PlotColor = {
X &V_PlotColor, /* variable */
X "PlotColor", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "no", /* default */
X "boolean", /* Default type */
X H_PlotColor
X };
Xchar *H_PlotDevice[] = {
X "\t'PlotDevice' specifies output device type.\n",
X (char *)NULL
X};
XVALUE V_PlotDevice;
XARGDEF A_PlotDevice = {
X &V_PlotDevice, /* variable */
X "PlotDevice", /* ID */
X "amiga|printer|iff|hp|aegis|postscript",/* options */
X "string|string|string|string|string|string",/* format */
X "amiga", /* default */
X "string", /* Default type */
X H_PlotDevice
X };
Xchar *H_PlotJoined[] = {
X "\t'PlotJoined' is set connects each data point with a line in the\n",
X "\tcurrent line style. (ex PlotJoined=on )\n",
X (char *)NULL
X};
XVALUE V_PlotJoined;
XARGDEF A_PlotJoined = {
X &V_PlotJoined, /* variable */
X "PlotJoined", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "yes", /* default */
X "boolean", /* Default type */
X H_PlotJoined
X };
Xchar *H_PlotPoints[] = {
X "\t'PlotPoints' if set causes symbols to be plotted in the current\n",
X "\tsymbol style at each data point. (ex. PlotPoints=true )\n",
X (char *)NULL
X};
XVALUE V_PlotPoints;
XARGDEF A_PlotPoints = {
X &V_PlotPoints, /* variable */
X "PlotPoints", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "false", /* default */
X "boolean", /* Default type */
X H_PlotPoints
X };
Xchar *H_PlotTitle[] = {
X "\t'PlotTitle' takes the plot title as an argument.\n",
X "\tGreek symbols may be specified by preceding a character by\n",
X "\t'#g'. Superscripts and subscripts may be specified using\n",
X "\t'#u', '#d' respectively.\n",
X (char *)NULL
X};
XVALUE V_PlotTitle;
XARGDEF A_PlotTitle = {
X &V_PlotTitle, /* variable */
X "PlotTitle", /* ID */
X "*", /* options */
X "string", /* format */
X "", /* default */
X "string", /* Default type */
X H_PlotTitle
X };
Xchar *H_PlotType[] = {
X "\t'PlotType' specifies the 'graph paper' upon which the plot is drawn.\n",
X "\tThe current implementation plots in\n",
X "\t\tlinear-linear,\n",
X "\t\tlog-linear,\n",
X "\t\tlinear-log,\n",
X "\t\tlog-log, and\n",
X "\t\tpolar\n",
X "\tformats.\n",
X "\tFor the log type plots, the log of the data is computed\n",
X "\tby ListPlot.\n",
X "\tFor polar plots, see also 'AngularUnit' and 'PolarVariable'.\n",
X (char *)NULL
X};
XVALUE V_PlotType;
XARGDEF A_PlotType = {
X &V_PlotType, /* variable */
X "PlotType", /* ID */
X "linlin|loglin|linlog|loglog|polar",/* options */
X "string|string|string|string|string",/* format */
X "linlin", /* default */
X "string", /* Default type */
X H_PlotType
X };
Xchar *H_PointScale[] = {
X "\t'PointScale' controls the relative size of the data point symbols\n",
X "\twhen data point symbols are being plotted.\n",
X (char *)NULL
X};
XVALUE V_PointScale;
XARGDEF A_PointScale = {
X &V_PointScale, /* variable */
X "PointScale", /* ID */
X "dbl", /* options */
X "dbl", /* format */
X "1.0", /* default */
X "dbl", /* Default type */
X H_PointScale
X };
Xchar *H_PointSymbol[] = {
X "\t'PointSymbol' specifies a list of symbols to be used when plotting\n",
X "\tdata points. The symbols types are encoded as integers.\n",
X "\tSee the PLPLOT library documentation to find the symbols\n",
X "\tavailable.\n",
X (char *)NULL
X};
XVALUE V_PointSymbol;
XARGDEF A_PointSymbol = {
X &V_PointSymbol, /* variable */
X "PointSymbol", /* ID */
X "Automatic|set", /* options */
X "string|set", /* format */
X "Automatic", /* default */
X "string", /* Default type */
X H_PointSymbol
X };
Xchar *H_PolarVariable[] = {
X "\t'PolarVariable' for polar plots is used to specify\n",
X "\twhether the independent variable is angular or radial.\n",
X (char *)NULL
X};
XVALUE V_PolarVariable;
XARGDEF A_PolarVariable = {
X &V_PolarVariable, /* variable */
X "PolarVariable", /* ID */
X "angle|radius", /* options */
X "string|string", /* format */
X "angle", /* default */
X "string", /* Default type */
X H_PolarVariable
X };
Xchar *H_Orientation[] = {
X "\t'Orientation' controls whether the plot is displayed in\n",
X "\tlandscape or portrait orientation.\n",
X (char *)NULL
X};
XVALUE V_Orientation;
XARGDEF A_Orientation = {
X &V_Orientation, /* variable */
X "Orientation", /* ID */
X "portrait|landscape", /* options */
X "string|string", /* format */
X "landscape", /* default */
X "string", /* Default type */
X H_Orientation
X };
Xchar *H_Range[] = {
X "\t'Range' specifies the y axis bounds. (ex. Range=-1,1 )\n",
X (char *)NULL
X};
XVALUE V_Range;
XARGDEF A_Range = {
X &V_Range, /* variable */
X "Range", /* ID */
X "interval|All|Automatic", /* options */
X "interval|string|string", /* format */
X "All", /* default */
X "string", /* Default type */
X H_Range
X };
Xchar *H_SubPages[] = {
X "\t'SubPages' specifies the number of plots on a pages.\n",
X "\tThis is a vestige of PLPLOT and I am not sure this has any use\n",
X "\twithin the context of 'ListPlot. It might be useful for\n",
X "\tcontrolling the size of the plots but the 'ViewPort' might be\n",
X "\ta more direct solution.\n",
X (char *)NULL
X};
XVALUE V_SubPages;
XARGDEF A_SubPages = {
X &V_SubPages, /* variable */
X "SubPages", /* ID */
X "interval", /* options */
X "interval", /* format */
X "1.0,1.0", /* default */
X "interval", /* Default type */
X H_SubPages
X };
Xchar *H_SupplyAbscissa[] = {
X "\t'SupplyAbscissa' if set causes ListPlot to supply a value for\n",
X "\tthe independent variable.\n",
X (char *)NULL
X};
XVALUE V_SupplyAbscissa;
XARGDEF A_SupplyAbscissa = {
X &V_SupplyAbscissa, /* variable */
X "SupplyAbscissa", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "no", /* default */
X "boolean", /* Default type */
X H_SupplyAbscissa
X };
Xchar *H_TitleScale[] = {
X "\t'TitleScale' controls the relative size of the title text.\n",
X (char *)NULL
X};
XVALUE V_TitleScale;
XARGDEF A_TitleScale = {
X &V_TitleScale, /* variable */
X "TitleScale", /* ID */
X "dbl", /* options */
X "dbl", /* format */
X "1.0", /* default */
X "dbl", /* Default type */
X H_TitleScale
X };
Xchar *H_UseInputFile[] = {
X "\t'UseInputFile' permits the specification of an input file if\n",
X "\tyou would rather not use stdin.\n",
X (char *)NULL
X};
XVALUE V_UseInputFile;
XARGDEF A_UseInputFile = {
X &V_UseInputFile, /* variable */
X "UseInputFile", /* ID */
X "*", /* options */
X "string", /* format */
X "", /* default */
X "string", /* Default type */
X H_UseInputFile
X };
Xchar *H_UseOutputFile[] = {
X "\t'UseOutputFile' permits the specification of an output file if\n",
X "\tyou would rather not use stdout.\n",
X (char *)NULL
X};
XVALUE V_UseOutputFile;
XARGDEF A_UseOutputFile = {
X &V_UseOutputFile, /* variable */
X "UseOutputFile", /* ID */
X "*", /* options */
X "string", /* format */
X "", /* default */
X "string", /* Default type */
X H_UseOutputFile
X };
X/* Not used. V_AspectRatio may be used to control viewport in a nicer way */
Xchar *H_Verbose[] = {
X "\t'Verbose' if set causes extended messaging.\n",
X (char *)NULL
X};
XVALUE V_Verbose;
XARGDEF A_Verbose = {
X &V_Verbose, /* variable */
X "Verbose", /* ID */
X "boolean", /* options */
X "boolean", /* format */
X "off", /* default */
X "boolean", /* Default type */
X H_Verbose
X };
Xchar *H_ViewPort[] = {
X "\t'ViewPort' allows control over the size of a plot. Takes\n",
X "\ta viewing rectangle diagonal as an argument.\n",
X "\t\t(ex. ViewPort=\\{0.1,0.3, 0.9,0.6\\} )\n",
X (char *)NULL
X};
XVALUE V_ViewPort;
XARGDEF A_ViewPort = {
X &V_ViewPort, /* variable */
X "ViewPort", /* ID */
X "rect", /* options */
X "rect", /* format */
X "{0.1,0.1,0.9,0.9}", /* default */
X "rect", /* Default type */
X H_ViewPort
X };
Xchar *H_XLabel[] = {
X "\t'XLabel' specifies X axis label. Greek characters may be included\n",
X "\tby preceding the character with '#g'. Superscripts and subscripts\n",
X "\tmay be included using '#u' and '#d' control sequences respectively.\n",
X (char *)NULL
X};
XVALUE V_XLabel;
XARGDEF A_XLabel = {
X &V_XLabel, /* variable */
X "XLabel", /* ID */
X "*", /* options */
X "string", /* format */
X "", /* default */
X "string", /* Default type */
X H_XLabel
X };
Xchar *H_XTick[] = {
X "\t'XTick' controls the spacing of major axis ticks and the number\n",
X "\tof minor subdivisions. (ex. XTick=0.1,10 indicates major ticks at\n",
X "\tunits of 0.1 with 10 minor subdivisions.)\n",
X (char *)NULL
X};
XVALUE V_XTick;
XARGDEF A_XTick = {
X &V_XTick, /* variable */
X "XTick", /* ID */
X "Automatic|interval", /* options */
X "string|interval", /* format */
X "Automatic", /* default */
X "string", /* Default type */
X H_XTick
X };
Xchar *H_YLabel[] = {
X "\t'YLabel' specifies Y axis label. Greek characters may be included\n",
X "\tby preceding the character with '#g'. Superscripts and subscripts\n",
X "\tmay be included using '#u' and '#d' control sequences respectively.\n",
X (char *)NULL
X};
XVALUE V_YLabel;
XARGDEF A_YLabel = {
X &V_YLabel, /* variable */
X "YLabel", /* ID */
X "*", /* options */
X "string", /* format */
X "", /* default */
X "string", /* Default type */
X H_YLabel
X };
Xchar *H_YTick[] = {
X "\t'YTick' controls the spacing of major axis ticks and the number\n",
X "\tof minor subdivisions. (ex. YTick=0.1,10 indicates major ticks at\n",
X "\tunits of 0.1 with 10 minor subdivisions.)\n",
X (char *)NULL
X};
XVALUE V_YTick;
XARGDEF A_YTick = {
X &V_YTick, /* variable */
X "YTick", /* ID */
X "Automatic|interval", /* options */
X "string|interval", /* format */
X "Automatic", /* default */
X "string", /* Default type */
X H_YTick
X };
X
XARGDEF *SymbolTable[] = {
X &A_AngularUnit,
X &A_AnnotationScale,
X &A_AspectRatio,
X &A_Boxed,
X &A_Domain,
X &A_Gridding,
X &A_Help,
X &A_LabelScale,
X &A_LineColor,
X &A_LineStyle,
X &A_Orientation,
X &A_Origin,
X &A_PlotColor,
X &A_PlotJoined,
X &A_PlotPoints,
X &A_PointScale,
X &A_PointSymbol,
X &A_PlotTitle,
X &A_PlotDevice,
X &A_PlotType,
X &A_PolarVariable,
X &A_Range,
X &A_SubPages,
X &A_SupplyAbscissa,
X &A_TitleScale,
X &A_UseInputFile,
X &A_UseOutputFile,
X &A_Verbose,
X &A_ViewPort,
X &A_XLabel,
X &A_YLabel,
X &A_XTick,
X &A_YTick,
X (ARGDEF *)NULL
X };
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X register int i;
X int NTuples, TupleSize;
X FLOAT **Data;
X FILE *Fp;
X void InterruptHandler();
X#ifdef ANSI_C
X FLOAT **GetData(FILE *, int *, int *);
X void ListPlot(FLOAT **,int ,int );
X#else
X FLOAT **GetData();
X void ListPlot();
X#endif
X
X
X get_args(argc, argv, SymbolTable, Usage, Function);
X
X if (VtoBoolean(V_Verbose)) {
X fprintf(stderr, "Arg values:\n");
X for (i=0; SymbolTable[i]; i++) {
X fputc('\t' ,stderr);
X PrintArg(stderr, SymbolTable[i]);
X }
X }
X
X
X if (signal(SIGINT, SIG_IGN) != SIG_IGN)
X signal(SIGINT, InterruptHandler);
X
X
X if (strlen(V_UseInputFile.val_u.udt_string) > 0) {
X if ((Fp = fopen(V_UseInputFile.val_u.udt_string, "r")) == (FILE *)NULL) {
X perror(V_UseInputFile.val_u.udt_string);
X exit(errno);
X }
X } else {
X Fp = stdin;
X }
X if (strlen(V_UseOutputFile.val_u.udt_string) > 0) {
X if (!freopen(V_UseOutputFile.val_u.udt_string, "w", stdout)) {
X perror(V_UseOutputFile.val_u.udt_string);
X exit(errno);
X }
X }
X if ((Data = GetData(Fp, &NTuples, &TupleSize)) == (FLOAT **)NULL) {
X /* error */
X fprintf(stderr, "Unable to read data...\n");
X ErrorExit();
X }
X
X ListPlot(Data, NTuples, TupleSize);
X}
X
X
Xvoid
XInterruptHandler()
X{
X ErrorExit(); /* will not return */
X return; /* To satisfy some compilers */
X}
X
X
Xvoid
XErrorExit()
X{
X if (GraphicsInProgress)
X plend();
X exit(0);
X}
END_OF_FILE
if test 19564 -ne `wc -c <'Csrc/ListPlot.c'`; then
echo shar: \"'Csrc/ListPlot.c'\" unpacked with wrong size!
fi
chmod +x 'Csrc/ListPlot.c'
# end of 'Csrc/ListPlot.c'
fi
if test -f 'Csrc/get_args.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Csrc/get_args.c'\"
else
echo shar: Extracting \"'Csrc/get_args.c'\" \(14827 characters\)
sed "s/^X//" >'Csrc/get_args.c' <<'END_OF_FILE'
X/*
X * get_args.c
X *
X * command line argument parser
X */
X#include <stdio.h>
X#include <errno.h>
Xextern int errno;
X#include <assert.h>
X#include <ctype.h>
X#include <string.h>
X#include "datatypes.h"
X
X/*
X#define min(A,B) A<B? A : B
X#define max(A,B) A>B? A : B
X*/
X
Xvoid
Xget_args(argc, argv, Symbols, Usage, Function)
Xint argc;
Xchar **argv;
XARGDEF *Symbols[];
Xchar *Usage[], *Function[];
X{
X register int i;
X bool helped;
X bool Help(), ParseHelp();
X
X /* set default values */
X SetDefaults(Symbols);
X
X helped = FALSE;
X for (i=1; i<argc; i++)
X if (argv[i][0] == '?' || argv[i][0] == '-') {
X Help(Usage, Function, Symbols, "All");
X helped = TRUE;
X } else if (strncmp(argv[i], "Help",4)==0 || strncmp(argv[i],"help",4)==0) {
X ParseHelp(Usage, Function, Symbols, argv[i]);
X helped = TRUE;
X } else if (ParseArg(Symbols, argv[i])) {
X continue;
X } else {
X errno = EINVAL;
X perror(argv[i]);
X goto error_exit;
X }
X if (helped == TRUE)
X exit(0);
X else
X return;
X
Xerror_exit:
X PrintUsage(stderr, Usage, Function, Symbols);
X exit(errno);
X}
X
X
Xvoid
XSetDefaults(Symbols)
XARGDEF *Symbols[];
X{
X register int i;
X
X for (i=0; Symbols[i]; i++)
X if (SetValue(
X Symbols[i]->ad_value,
X Symbols[i]->ad_default,
X Symbols[i]->ad_defaultType
X ) != TRUE) {
X /* error */
X fprintf(stderr,"Internal error: (SetDefaults) Unable to set ");
X PrintArgDef(stderr,Symbols[i]);
X errno = EINVAL;
X exit(errno);
X }
X return;
X}
X
X
Xbool
XSetValue(Val, ValStr, ValType)
XVALUE *Val;
Xchar *ValStr;
Xchar *ValType;
X{
X register int WidType;
X
X WidType = strlen(ValType);
X if (strncmp(ValType, "string", WidType) == 0) {
X return(SetString(Val, ValStr));
X } else if (strncmp(ValType, "dbl", WidType) == 0) {
X return(SetDbl(Val, ValStr));
X } else if (strncmp(ValType, "float", WidType) == 0) {
X return(SetFloat(Val, ValStr));
X } else if (strncmp(ValType, "int", WidType) == 0) {
X return(SetInt(Val, ValStr));
X } else if (strncmp(ValType, "boolean", WidType) == 0) {
X return(SetBool(Val, ValStr));
X } else if (strncmp(ValType, "byte", WidType) == 0) {
X return(SetByte(Val, ValStr));
X } else if (strncmp(ValType, "interval", WidType) == 0) {
X return(SetInterval(Val, ValStr));
X } else if (strncmp(ValType, "set", min(WidType,3)) == 0) {
X return(SetSet(Val, ValStr, ValType, WidType));
X } else if (strncmp(ValType, "rect", WidType) == 0) {
X return(SetRect(Val, ValStr));
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetString(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X Val->val_type = string;
X Val->val_u.udt_string = StrDup(ValStr);
X return(TRUE);
X}
X
X
Xbool
XSetDbl(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X double D;
X
X if (sscanf(ValStr, "%lf", &D) == 1) {
X Val->val_type = dbl;
X Val->val_u.udt_dbl = D;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetFloat(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X float F;
X
X if (sscanf(ValStr, "%f", &F) == 1) {
X Val->val_type = flt;
X Val->val_u.udt_flt = F;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetInt(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X int I;
X
X if (sscanf(ValStr, "%d", &I) == 1) {
X Val->val_type = integer;
X Val->val_u.udt_int = I;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetBool(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X register int i, n;
X char s[32];
X
X n = min(strlen(ValStr),sizeof(s)-1);
X for (i=0; i<n; i++)
X s[i] = isupper(ValStr[i])? tolower(ValStr[i]) : ValStr[i];
X s[i] = (char)NULL;
X n = i - 1;
X
X if (
X strncmp(s, "true", n) == 0 ||
X strncmp(s, "on", n) == 0 ||
X strncmp(s, "yes", n) == 0 ||
X strncmp(s, "1", n) == 0)
X {
X Val->val_type = boolean;
X Val->val_u.udt_bool = TRUE;
X return(TRUE);
X } else if (
X strncmp(s, "false", n) == 0 ||
X strncmp(s, "off", n) == 0 ||
X strncmp(s, "no", n) == 0 ||
X strncmp(s, "0", n) == 0)
X {
X Val->val_type = boolean;
X Val->val_u.udt_bool = FALSE;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetByte(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X char C;
X Val->val_type = byte;
X if (sscanf(ValStr, "%c", &C) == 1) {
X Val->val_u.udt_byte = (char)C;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetInterval(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X double lo, hi;
X Val->val_type = interval;
X if (sscanf(ValStr, "%lf,%lf", &lo,&hi) == 2) {
X Val->val_u.udt_interval.int_lo = lo;
X Val->val_u.udt_interval.int_hi = hi;
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
X
Xbool
XSetSet(Val, ValStr, ValType, WidType)
XVALUE *Val;
Xchar *ValStr;
Xchar *ValType;
Xint WidType;
X{
X int i;
X SET *S;
X char *LeftBrace, *RightBrace;
X char *Start;
X char *sp;
X bool Escape;
X int WidStr;
X char s[128];
X char *SkipBlanks(char *);
X
X Val->val_type = set;
X S = &Val->val_u.udt_set;
X S->list_n = 0;
X S->list_head = (LATOM *)NULL;
X S->list_tail = (LATOM *)NULL;
X
X if ((LeftBrace = strchr(ValStr, '{')) == (char *)NULL) {
X /*error*/
X fprintf(stderr,"(SetSet) Invalid set specification: \"%s\" (missing left brace).\n", ValStr);
X exit(0);
X }
X Start = LeftBrace+1;
X if ((RightBrace = strchr(ValStr, '}')) == (char *)NULL) {
X /*error*/
X fprintf(stderr,"(SetSet) Invalid set specification: \"%s\" (missing right brace).\n", ValStr);
X exit(0);
X }
X WidStr = RightBrace - Start;
X
X for (sp=Start; *sp && *sp != '}'; ) {
X/* sp = SkipBlanks(sp); */
X for ( Escape=FALSE,i=0; *sp && (Escape==TRUE || (Escape==FALSE && *sp != ',' && *sp != '}')); sp++) {
X if (Escape == TRUE) {
X s[i++] = *sp;
X Escape = !Escape;
X } else if (*sp == '\\' && Escape == FALSE) {
X Escape = !Escape;
X } else {
X assert(*sp != '\\' && Escape == FALSE);
X s[i++] = *sp;
X }
X }
X s[i] = (char)NULL;
X Append(S, (generic *)StrDup(s));
X if (*sp == ',')
X ++sp;
X }
X
X return(TRUE);
X}
X
X
Xbool
XSetRect(Val, ValStr)
XVALUE *Val;
Xchar *ValStr;
X{
X register char *sp;
X register int i;
X FLOAT *R;
X char *LeftBrace, *RightBrace;
X char *Start;
X char s[128];
X char *SkipBlanks(char *);
X double atof();
X
X Val->val_type = rect;
X R = Val->val_u.udt_rect.r_diag;
X
X if ((LeftBrace = strchr(ValStr, '{')) == (char *)NULL) {
X /*error*/
X fprintf(stderr,"(SetRect) Invalid rect specification: \"%s\" (missing left brace).\n", ValStr);
X exit(0);
X }
X Start = LeftBrace+1;
X if ((RightBrace = strchr(ValStr, '}')) == (char *)NULL) {
X /*error*/
X fprintf(stderr,"(SetRect) Invalid rect specification: \"%s\" (missing right brace).\n", ValStr);
X exit(0);
X }
X
X for (sp=Start; *sp && *sp != '}'; ) {
X sp = SkipBlanks(sp);
X for ( i=0; *sp && *sp != ',' && *sp != '}'; sp++) {
X s[i++] = *sp;
X }
X s[i] = (char)NULL;
X *R++ = atof(s);
X if (*sp == ',')
X ++sp;
X }
X
X return(TRUE);
X}
X
X
Xchar *
XSkipBlanks(s)
Xregister char *s;
X{
X while(isspace(*s))
X ++s;
X return(s);
X}
X
X
Xvoid
XPrintUsage(Fp, Usage, Function, Symbols)
XFILE *Fp;
Xchar *Usage[];
Xchar *Function[];
XARGDEF *Symbols[];
X{
X register int i;
X
X for (i=0; Usage[i]; i++)
X fputs(Usage[i], Fp);
X for (i=0; Function[i]; i++)
X fputs(Function[i], Fp);
X fprintf(Fp, "Options:\n");
X for (i=0; Symbols[i]; i++) {
X fputc('\t', Fp);
X PrintArgDef(Fp, Symbols[i]);
X }
X}
X
X
Xbool
XParseHelp(Usage, Function, Symbols, arg)
Xchar *Usage;
Xchar *Function;
XARGDEF *Symbols[];
Xchar *arg;
X{
X bool Help();
X char *EqualSign;
X
X if (strncmp(arg, "Help", 4)==0 || strncmp(arg, "help", 4)==0) {
X if ((EqualSign = strchr(arg,'=')) == (char *)NULL)
X return(Help(Usage, Function, Symbols, "All"));
X else
X return(Help(Usage, Function, Symbols, EqualSign+1));
X }
X return(FALSE);
X}
X
X
Xbool
XHelp(Usage, Function, Symbols, arg)
Xchar *Usage[];
Xchar *Function[];
XARGDEF *Symbols[];
Xchar *arg;
X{
X register int i, j;
X extern VALUE V_Verbose;
X
X if (strcmp(arg, "All")==0 || strcmp(arg,"all")==0) {
X if (VtoBoolean(V_Verbose)) {
X for (i=0; Usage[i]; i++)
X fputs(Usage[i], stdout);
X for (i=0; Function[i]; i++)
X fputs(Function[i], stdout);
X fprintf(stdout, "Options:\n");
X for (i=0; Symbols[i]; i++) {
X fputc('\t', stdout);
X PrintArgDef(stdout, Symbols[i]);
X if ( Symbols[i]->ad_helptext != (char **)NULL) {
X for (j=0; Symbols[i]->ad_helptext[j]; j++)
X fputs(Symbols[i]->ad_helptext[j], stdout);
X }
X fputc('\n', stdout);
X }
X } else {
X fputs(Usage[0], stdout);
X fputs(Function[0], stdout);
X fprintf(stderr, "Options:\n");
X for (i=0; Symbols[i]; i++) {
X fputc('\t', stdout);
X PrintArgDef(stdout, Symbols[i]);
X }
X }
X return(TRUE);
X } else {
X /* find entry in symbol table */
X for (i=0; Symbols[i]; i++) {
X if (strcmp(arg,Symbols[i]->ad_id) == 0) {
X /* found */
X fputc('\t', stdout);
X PrintArgDef(stdout, Symbols[i]);
X if (VtoBoolean(V_Verbose) && Symbols[i]->ad_helptext != (char **)NULL) {
X for (j=0; Symbols[i]->ad_helptext[j]; j++)
X fputs(Symbols[i]->ad_helptext[j], stdout);
X fputc('\n', stdout);
X }
X return(TRUE);
X }
X }
X }
X return(FALSE);
X}
X
X
X
X
Xbool
XParseArg(Symbols, arg)
XARGDEF *Symbols[];
Xchar *arg;
X{
X register int i;
X char *EqualSign;
X char *ValueStr;
X int wid;
X
X if ((EqualSign = strchr(arg,'=')) == (char *)NULL) {
X ValueStr = arg;
X wid = strlen(ValueStr);
X } else {
X ValueStr = EqualSign + 1;
X wid = EqualSign - arg;
X }
X
X /* find entry in symbol table */
X for (i=0; Symbols[i]; i++) {
X if (strncmp(arg,Symbols[i]->ad_id, wid) == 0) {
X /* found */
X return(ParseEntry(Symbols[i], ValueStr));
X }
X }
X
X return(FALSE);
X}
X
X
Xbool
XParseEntry(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X char *StartOpt, *StartType;
X char *BarOpt;
X char *BarType;
X int WidOpt, WidType;
X
X StartOpt = Entry->ad_options;
X StartType = Entry->ad_opttype;
X do {
X if ((BarOpt = strchr(StartOpt,'|')) == (char *)NULL) {
X WidOpt = strlen(StartOpt);
X } else {
X WidOpt = BarOpt - StartOpt;
X }
X if ((BarType = strchr(StartType,'|')) == (char *)NULL) {
X WidType = strlen(StartType);
X } else {
X WidType = BarType - StartType;
X }
X
X if (strncmp(StartType, "string", WidType) == 0) {
X if (ParseString(Entry, StartOpt, WidOpt, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "dbl", WidType) == 0) {
X if (ParseDbl(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "float", WidType) == 0) {
X if (ParseFloat(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "int", WidType) == 0) {
X if (ParseInt(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "boolean", WidType) == 0) {
X if (ParseBool(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "byte", WidType) == 0) {
X if (ParseByte(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "interval", WidType) == 0) {
X if (ParseInterval(Entry, arg) == TRUE)
X return(TRUE);
X else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "set", min(WidType,3)) == 0) {
X if (ParseSet(Entry, arg, StartType,WidType) == TRUE) {
X return(TRUE);
X } else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else if (strncmp(StartType, "rect", WidType) == 0) {
X if (ParseRect(Entry, arg) == TRUE) {
X return(TRUE);
X } else {
X StartOpt = ++BarOpt;
X StartType = ++BarType;
X continue;
X }
X } else {
X fprintf(stderr, "Internal Error: invalid option type string: \"%s\"\n", StartType);
X PrintArgDef(stderr,Entry);
X errno = EINVAL;
X exit(errno);
X }
X } while(StartOpt != (char)NULL && StartType != (char)NULL);
X return(TRUE);
X}
X
X
Xbool
XParseString(Entry, Option, n, arg)
XARGDEF *Entry;
Xchar *Option;
Xint n;
Xchar *arg;
X{
X if (*Option == '*') {
X /* Match any string */
X Entry->ad_value->val_type = string;
X Entry->ad_value->val_u.udt_string = StrDup(arg);
X return(TRUE);
X } else if (arg!=(char *)NULL && strncmp(arg,Option,strlen(arg)) == 0) {
X /* Matches option */
X Entry->ad_value->val_type = string;
X Entry->ad_value->val_u.udt_string = StrDup(arg);
X return(TRUE);
X } else {
X return(FALSE);
X }
X}
X
Xchar *
XStrDup(Str)
Xchar *Str;
X{
X register int n;
X register char *Dup;
X
X if (Str == (char *)NULL)
X return((char *)NULL);
X
X n = strlen(Str);
X if ((Dup = malloc(n+1)) == (char *)NULL) {
X perror("(StrDup) ");
X assert(Dup != (char *)NULL);
X exit(errno);
X }
X memcpy(Dup, Str, n+1);
X return(Dup);
X}
X
X
Xbool
XParseDbl(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetDbl(Entry->ad_value, arg));
X}
X
Xbool
XParseFloat(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetFloat(Entry->ad_value, arg));
X}
X
Xbool
XParseInt(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetInt(Entry->ad_value, arg));
X}
X
Xbool
XParseBool(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetBool(Entry->ad_value, arg));
X}
X
Xbool
XParseByte(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetByte(Entry->ad_value, arg));
X}
X
Xbool
XParseInterval(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetInterval(Entry->ad_value, arg));
X}
X
Xbool
XParseSet(Entry, arg, Type, WidType)
XARGDEF *Entry;
Xchar *arg;
Xchar *Type;
Xint WidType;
X{
X return(SetSet(Entry->ad_value, arg, Type, WidType));
X}
X
Xbool
XParseRect(Entry, arg)
XARGDEF *Entry;
Xchar *arg;
X{
X return(SetRect(Entry->ad_value, arg));
X}
X
X
Xvoid
XPrintArgDef(Fp, Def)
XFILE *Fp;
XARGDEF *Def;
X{
X fprintf(Fp, "%s=", Def->ad_id);
X fprintf(Fp, "[%s]", Def->ad_options);
X fprintf(Fp, " default: %s\n", Def->ad_default);
X fflush(Fp);
X}
X
X
Xvoid
XPrintArg(Fp, Def)
XFILE *Fp;
XARGDEF *Def;
X{
X LATOM *A;
X
X switch(Def->ad_value->val_type) {
X default:
X fprintf(Fp,"%s=<Invalid datatype>!\n", Def->ad_id);
X break;
X case boolean:
X fprintf(Fp,"%s=%s\n",
X Def->ad_id,
X Def->ad_value->val_u.udt_bool? "TRUE":"FALSE");
X break;
X case integer:
X fprintf(Fp,"%s=%d\n",Def->ad_id,Def->ad_value->val_u.udt_int);
X break;
X case dbl:
X fprintf(Fp,"%s=%lg\n",Def->ad_id,Def->ad_value->val_u.udt_dbl);
X break;
X case flt:
X fprintf(Fp,"%s=%g\n",Def->ad_id,Def->ad_value->val_u.udt_flt);
X break;
X case byte:
X fprintf(Fp,"%s=%c\n",Def->ad_id,Def->ad_value->val_u.udt_byte);
X break;
X case string:
X fprintf(Fp,"%s=\"%s\"\n",Def->ad_id,Def->ad_value->val_u.udt_string);
X break;
X case interval:
X fprintf(Fp,"%s=%g,%g\n",Def->ad_id,Def->ad_value->val_u.udt_interval);
X break;
X case set:
X fprintf(Fp,"%s={\n",Def->ad_id);
X for (A=Def->ad_value->val_u.udt_set.list_head; A; A=A->la_next)
X if (A->la_next)
X fprintf(Fp,"\t\t<%s>,\n",(char *)A->la_p);
X else
X fprintf(Fp,"\t\t<%s>\n",(char *)A->la_p);
X fprintf(Fp, "\t}\n");
X break;
X case rect:
X fprintf(
X Fp,
X "%s={%g,%g, %g,%g}\n",
X Def->ad_id,
X Def->ad_value->val_u.udt_rect.r_diag[0],
X Def->ad_value->val_u.udt_rect.r_diag[1],
X Def->ad_value->val_u.udt_rect.r_diag[2],
X Def->ad_value->val_u.udt_rect.r_diag[3]
X );
X break;
X }
X}
END_OF_FILE
if test 14827 -ne `wc -c <'Csrc/get_args.c'`; then
echo shar: \"'Csrc/get_args.c'\" unpacked with wrong size!
fi
chmod +x 'Csrc/get_args.c'
# end of 'Csrc/get_args.c'
fi
if test -f 'docs/ListPlot.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'docs/ListPlot.uu'\"
else
echo shar: Extracting \"'docs/ListPlot.uu'\" \(19126 characters\)
sed "s/^X//" >'docs/ListPlot.uu' <<'END_OF_FILE'
Xbegin 600 ListPlot.man
XM"B`@("`@3&ES=%!L;W0H,2D@("`@("`@("`@("`@("`@("!!34E'02!-86YUW
XM86P@("`@("`@("`@("`@("`@("!,:7-T4&QO="@Q*0H*"@H@("`@()LQ;4Y!:
XM344@"B`@("`@("`@("";,&U,:7-T4&QO="`M(&$@=F%N:6QL82!P;&]T=&ENN
XM9R!F:6QT97(@"@H@("`@()LQ;5-93D]04TE3(`H@("`@("`@("`@3&ES=%!LD
XM;W0@FS!M6R!O<'1I;VYS(%T@"@H@("`@()LQ;41%4T-225!424].(`H@("`@Z
XM("`@("`@FS!MFS-M3&ES=%!L;W0@()LP;6$@('-I;7!L92`@,D0@('!L;W1TZ
XM:6YG(&9I;'1E<B!B87-E9"!O;B!T:&4@FS-M4$Q03$]4"B`@("`@("`@("";\
XM,&UP;&]T=&EN9R!L:6)R87)Y+B`@"@H@("`@("`@("`@271S('!R:6YC:7!L6
XM92!A9'9A;G1A9V4@:7,@=&AA="!I="`@<W5P<&]R=',@(&$@('9A<FEE='D@/
XM(&]F"B`@("`@("`@("!G<F%P:&EC<R!D979I8V5S+B`@"@H@("`@("`@("`@5
XMFS-M3&ES=%!L;W0@()LP;7)E861S(&9R;VT@<W1D:6X@86YD('=R:71E<R!TX
XM;R!S=&1O=70@=6YL97-S(&EN<'5T"B`@("`@("`@("!A;F0O;W(@;W5T<'5T:
XM(&9I;&5S(&%R92!S<&5C:69I960@;VX@=&AE(&-O;6UA;F0@;&EN92X@("!4>
XM:&4*("`@("`@("`@('!R;V=R86T@86-C97!T<R`@82!F:6QE(&]F(&XM='5P\
XM;&5S+B`@16%C:"!T=7!L92!C;VYS:7-T<R!O9@H@("`@("`@("`@82!S97%U!
XM96YC92!O9B`@<W!A8V4M<V5P87)A=&5D("!N=6UB97)S("!T97)M:6YA=&5DK
XM("!W:71H("!A"B`@("`@("`@("!N97=L:6YE+B`@(%1H92`@9FER<W0@96QE&
XM;65N="!O9B!E86-H('1U<&QE(&ES(&%S<W5M960@=&\@8F4*("`@("`@("`@&
XM('1H92!I;F1E<&5N9&5N="!V87)I86)L92X@($5A8V@@<F5M86EN:6YG(&5L?
XM96UE;G0@:7,@<&QO='1E9`H@("`@("`@("`@86=A:6YS="!T:&4@9FER<W0@K
XM=&\@<')O9'5C92!N+3$@8W5R=F5S+B`@"@H@("`@("`@("`@FS-M3&ES=%!LN
XM;W0@FS!M=&%K97,@82!N=6UB97(@;V8@8V]M;6%N9"!L:6YE(&%R9W5M96YT\
XM<R`@=&AA="`@;6%Y"B`@("`@("`@("!B92!U<V5D("!T;R`@8V]N=')O;"`@Q
XM=&AE("!A<'!E87)A;F-E(&]F('1H92!P;&]T<RX@($-O;6UA;F0*("`@("`@P
XM("`@(&QI;F4@87)G=6UE;G1S(&%R92!S<&5C:69I960@:6X@=&AE(&9O<FT@.
XM"B`@("`@("`@("`@("`@("`@("`@FS-M=F%R:6%B;&4]=F%L=64@"@H@("`@9
XM("`@("`@FS!M1F]R(&$@;&ES="!O9B!T:&4@87)G=6UE;G1S(&5N=&5R.B`*J
XM"B`@("`@("`@("`@("`@("`@("`@3&ES=%!L;W0@2&5L<#U!;&PN("`*"B`@&
XM("`@FS%M5D%224%"3$53(%194$53(`H@("`@("`@("`@0F]O;&5A;J";,&V@)
XMH'9A;'5E<R!A8V-E<'0@=F%L=65S('-U8V@@87,@FS%M=')U99LP;2P@FS%M-
XM9F%L<V6;,&TL()LQ;7EE<YLP;2P@FS%M;F^;,&TL"B`@("`@("`@("`@("`@A
XM("`@("`@FS%M;VZ;,&TL()LQ;6]F9ILP;2P@FS%M,)LP;2P@86YD()LQ;3$@<
XMFS!M*&5X+B!0;&]T0V]L;W(]>65S*2X@(`H*("`@("`@("`@()LQ;5-T<FENK
XM9Z";,&V@H*!V86QU97,@97AP96-T('1H92!S=')I;F=S('1O(&5N=&5R960@-
XM87,@(&EN9&EC871E9`H@("`@("`@("`@("`@("`@("`@(&%N9"!I<R!C87-EN
XM('-E;G-I=&EV92`H97@N($1O;6%I;CU!;&PI+B`@"@H@("`@("`@("`@FS%M_
XM1&)LH)LP;:"@H*"@H'9A;'5E<R!E>'!E8W0@<F5A;"!N=6UB97)S("AE>"X@V
XM07-P96-T4F%T:6\],2XP*2X@(`H*("`@("`@("`@()LQ;4EN=&5R=F%LH)LP_
XM;:!V86QU97,@97AP96-T(&$@<&%I<B!O9B!C;VUM82!S97!A<F%T960@<F5AF
XM;',@*&5X+@H@("`@("`@("`@("`@("`@("`@(%)A;F=E/2TQ+C`L,RXP*2X@6
XM(`H*("`@("`@("`@()LQ;5-E=*";,&V@H*"@H*!V86QU97,@(&5X<&5C="`@*
XM82!L:7-T(&]F(&-O;6UA('-E<&%R871E9"!E;&5M96YT<PH@("`@("`@("`@_
XM("`@("`@("`@(&5N8VQO<V5D("`@(&EN("`@(&-U<FQY("`@(&)R86-E<R`@#
XM("`H>WTI+B`@("`H97@N"B`@("`@("`@("`@("`@("`@("`@3&EN95-T>6QE-
XM/7M-4RQ-35,L35-M;5-]*2`*"B`@("`@("`@("";,6U296-TH)LP;:"@H*"@#
XM=F%L=65S("!E>'!E8W0@(&$@(&QI<W0@;V8@8V]M;6$@<V5P87)A=&5D(&YUT
XM;6)E<G,*("`@("`@("`@("`@("`@("`@("!R97!R97-E;G1I;F<@82!D:6%GO
XM;VYA;"!F<F]M('1H92!L;W=E<BUL969T(&-O<FYE<@H@("`@("`@("`@("`@3
XM("`@("`@('1O('1H92!U<'!E<BUR:6=H="!C;W)N97(@*&5X+B`@5FEE=U!O1
XM<G0]>S`N,2PP+C,L"B`@("`@("`@("`@("`@("`@("`@,"XY+#`N-GTI+B`@+
XM"@H*("`@("`@("`@(%1H92`@=&ET;&4@(&%N9"`@;&%B96P@=F%R:6%B;&5SM
XM(&%C8V5P="!S=')I;F=S('1H870@:6YC;'5D90H@("`@("`@("`@=&AE(&9O/
XM;&QO=VEN9R!C;VYT<F]L('-E<75E;F-E<SH@"@H@("`@("`@("`@("`@("`@W
XM("`@(".;,6UUFS!M.B!M;W9E('5P('1O('-U<&5R<V-R:7!T("AE;F1E9"!WE
XM:71H(".;,6UD()LP;2D@"B`@("`@("`@("`@("`@("`@("`@(YLQ;62;,&TZ"
XM(&UO=F4@9&]W;B!T;R!S=6)S8W)I<'0@*&5N9&5D('=I=&@@(YLQ;74@FS!M>
XM*2`*"@H@("`@(#4O,34O.3`@("`@("`@("`@("`@("`@("`@("`@("`@("TQ'
XM+2`@("`@("`@("`@("`@("`@("!$=6ME(%5N:79E<G-I='D*"@H@("`@($QIK
XM<W10;&]T*#$I("`@("`@("`@("`@("`@("`@04U)1T$@36%N=6%L("`@("`@E
XM("`@("`@("`@("`@3&ES=%!L;W0H,2D*"@H@("`@("`@("`@("`@("`@("`@[
XM(".;,6UBFS!M.B!B86-K<W!A8V4@=&\@86QL;W<@;W9E<G!R:6YT:6YG(`H@@
XM("`@("`@("`@("`@("`@("`@(",C.B!T:&4@;G5M8F5R('-Y;6)O;"`*("`@J
XM("`@("`@("`@("`@("`@("`C*SH@=&]G9VQE(&]V97)L:6YE(&UO9&4@"B`@]
XM("`@("`@("`@("`@("`@("`@(RTZ('1O9V=L92!U;F1E<FQI;F4@;6]D92`*!
XM("`@("`@("`@("`@("`@("`@("`CFS%M9WB;,&TZ($=R965K(&QE='1E<B!CN
XM;W)R97-P;VYD:6YG('1O(%)O;6%N(&QE='1E<B!X(`H*("`@("";,6U/4%1)+
XM3TY3(`H@("`@("`@("`@FS!M5&AE(&-U<G)E;G1L>2!A=F%I;&%B;&4@87)G6
XM=6UE;G1S(&%R92!I;F1I8V%T960@8F5L;W<N("";,6U";VQD"B`@("`@("`@D
XM("";,&UF86-E(&%R9W5M96YT<R!I;F1I8V%T92!T:&%T('1H97D@<VAO=6QDX
XM(&)E(&5N=&5R960@(&5X86-T;'D*("`@("`@("`@(&%S('-H;W=N+B`@($%N2
XM("<J)R!I;F1I8V%T97,@=&AA="!A;B!A<F)I=')A<GD@<W1R:6YG(&UA>2!B\
XM90H@("`@("`@("`@9VEV96XN("!!('-T<FEN9R!W:71H(&5M8F5D9&5D('-P7
XM86-E<R!M=7-T(&)E('%U;W1E9"X@(`H*("`@("`@("`@()LQ;4%N9W5L87)5X
XM;FETFS!M/5L@FS%M9&5G<F5E<R";,&U\()LQ;7)A9&EA;G,@FS!M72`*("`@A
XM("`@("`@("`@("`@("`@("";,VU!;F=U;&%R56YI="";,&US<&5C:69I97,@X
XM=&AE(&%N9W5L87(@=6YI="!O9B`@;65A<W5R90H@("`@("`@("`@("`@("`@<
XM("`@('5S960@9F]R("!P;VQA<B`@<&QO=',N("!&;W(@86YG;&5S(&EN(')A!
XM9&EA;G,@=7-E"B`@("`@("`@("`@("`@("`@("`@FS%M06YG=6QA<E5N:72;$
XM,&T]FS%M<F%D:6%N<YLP;2X@"@H@("`@("`@("`@FS%M06YN;W1A=&EO;E-C9
XM86QEFS!M/5L@FS-M9&)L()LP;5T@"B`@("`@("`@("`@("`@("`@("`@FS-MI
XM06YN;W1A=&EO;E-C86QE("`@FS!M8V]N=')O;',@("!T:&4@("!S:7IE("`@K
XM;V8@("!T:&4*("`@("`@("`@("`@("`@("`@("!C:&%R86-T97)S('5S960@1
XM=&\@86YN;W1A=&4@=&AE(&%X97,N("`*"B`@("`@("`@("";,6U!<W!E8W12\
XM871I;YLP;3U;()LS;61B;"";,&U\()LQ;4%U=&]M871I8R";,&U=(`H@("`@]
XM("`@("`@("`@("`@("`@()LS;4%S<&5C=%)A=&EO("";,&UC;VYT<F]L<R`@&
XM=&AE(')E;&%T:79E(&QE;F=T:',@;V8@=&AE"B`@("`@("`@("`@("`@("`@2
XM("`@=F5R=&EC86P@=&\@:&]R:7IO;G1A;"!A>&5S+B`@268@('-E="`@=&AIF
XM<R`@=F%L=64*("`@("`@("`@("`@("`@("`@("!O=F5R<FED97,@=&AE('9A%
XM;'5E(&]F()LS;59I97=0;W)T+B`*"B`@("`@("`@("";,&V;,6U";WAE9)LPF
XM;3U;()LS;6)O;VQE86X@FS!M?"`J(%T@"B`@("`@("`@("`@("`@("`@("`@%
XMFS-M0F]X960@FS!M861D<R`@87AE<R`@=&\@('1H92`@961G97,@(&]F('1H/
XM92!P;&]T+B`@268*("`@("`@("`@("`@("`@("`@("";,VU";WAE9"";,&UI9
XM<R!G:79E;B`@82`@8F]O;&5A;B`@=F%L=64@('1H96X@(&%X97,@(&%R90H@,
XM("`@("`@("`@("`@("`@("`@('!L86-E9"!O;B`@86QL("!O9B!T:&4@961G%
XM97,N("!)9B";,VU";WAE9"";,&UI<R!G:79E;B!A"B`@("`@("`@("`@("`@Z
XM("`@("`@<W1R:6YG(&-O;G-I<W1I;F<@;V8@;VYE(&]R(&UO<F4@;V8@()LSF
XM;70L("!B+"`@<BP@(&P*("`@("`@("`@("`@("`@("`@("";,&UT:&5N(&%X/
XM97,@87)E(&%D9&5D('1O('1O<"P@8F]T=&]M+"!R:6=H="!A;F0@;&5F=`H@+
XM("`@("`@("`@("`@("`@("`@(&5D9V5S(')E<W!E8W1I=F5L>2X@(`H*("`@)
XM("`@("`@()LQ;41O;6%I;ILP;3U;()LS;6EN=&5R=F%L()LP;7P@FS%M06QL'
XM()LP;7P@FS%M075T;VUA=&EC()LP;5T@"B`@("`@("`@("`@("`@("`@("`@S
XMFS-M1&]M86EN("";,&UM87D@8F4@=7-E9"!T;R!S<&5C:69Y('1H92!B;W5N5
XM9',@;VX@=&AE(%@*("`@("`@("`@("`@("`@("`@("!A>&ES+B`@5VAE;B!S_
XM970@=&\@FS%M06QLFS!M+"!A;&P@('!O:6YT<R`@87)E("!P;&]T=&5D+@H@T
XM("`@("`@("`@("`@("`@("`@(%=H96X@('-E="!T;R";,6U!=71O;6%T:6.;<
XM,&TL(&]U=&QY:6YG('!O:6YT<R!M87D@;F]T(&)E"B`@("`@("`@("`@("`@J
XM("`@("`@<&QO='1E9"X@(`H*("`@("`@("`@()LQ;4=R:61D:6YGFS!M/5L@/
XMFS-M8F]O;&5A;B";,&U=(`H@("`@("`@("`@("`@("`@("`@()LS;4=R:61D?
XM:6YG()LP;7!U=',@82!G<FED(&]N('1H92!P;&]T+B`@"@H@("`@("`@("`@H
XMFS%M2&5L<)LP;3U;()LQ;4%L;"";,&U\()LQ;6%L;"";,&U\("H@72`*("`@/
XM("`@("`@("`@("`@("`@("";,VU(96QP("";,&UP<F]V:61E<R`@<V]M92`@\
XM9&5S8W)I<'1I=F4@('1E>'0@(&9O<B`@('1H90H@("`@("`@("`@("`@("`@9
XM("`@('5S97(M<V5T=&%B;&4@<&QO='1I;F<@=F%R:6%B;&5S+B`@268@=&AEH
XM('9A<FEA8FQE"B`@("`@("`@("`@("`@("`@("`@FS-M5F5R8F]S92`@FS!MY
XM:7,@('-E="`@=&AE;B`@86X@97AT96YD960@9&5S8W)I<'1I;VX@:7,*("`@!
XM("`@("`@("`@("`@("`@("!P<F]V:61E9"X@(%1O('-E="!V97)B;W-E(&5NC
XM=&5R(`H*("`@("`@("`@("`@("`@("`@("!,:7-T4&QO="!697)B;W-E/7EE+
XM<R!(96QP/5L@FS-M=F%R:6%B;&4@FS!M?"";,6U!;&P@FS!M72X@(`H*("`@R
XM("`@("`@()LQ;4QA8F5L4V-A;&6;,&T]6R";,VUD8FP@FS!M72`*("`@("`@=
XM("`@("`@("`@("`@("";,VU,86)E;%-C86QE()LP;7-P96-I9FEE<R`@=&AE7
XM("!R96QA=&EV92`@<VEZ92`@;V8@('1H90H@("`@("`@("`@("`@("`@("`@7
XM('9E<G1I8V%L(&%N9"`@:&]R:7IO;G1A;"!A>&ES(&QA8F5L<RX@(%1H92!TB
XM>7!I8V%L"B`@("`@("`@("`@("`@("`@("`@<F%N9V4@:7,@6S`N-2`M(#(NP
XM,%TN("`*"B`@("`@("`@("";,6U,:6YE0V]L;W*;,&T]6R";,VUS970@FS!M>
XM72`*("`@("`@("`@("`@("`@("`@("";,VU,:6YE0V]L;W(@FS!M;6%Y(&)E/
XM('5S960@=&\@<W!E8VEF>2!A("!L:7-T("!O9B`@;&EN90H*"B`@("`@-2\QT
XM-2\Y,"`@("`@("`@("`@("`@("`@("`@("`@("`@+3(M("`@("`@("`@("`@9
XM("`@("`@($1U:V4@56YI=F5R<VET>0H*"B`@("`@3&ES=%!L;W0H,2D@("`@&
XM("`@("`@("`@("`@("!!34E'02!-86YU86P@("`@("`@("`@("`@("`@("!,I
XM:7-T4&QO="@Q*0H*"B`@("`@("`@("`@("`@("`@("`@8V]L;W)S("!F;W(@(
XM('!L;W1S("!W:71H("!M=6QT:7!L92`@8W5R=F5S(&EF('1H:7,*("`@("`@C
XM("`@("`@("`@("`@("!F96%T=7)E("!I<R`@<W5P<&]R=&5D("!F;W(@(&$@V
XM('!A<G1I8W5L87(@(&]U='!U=`H@("`@("`@("`@("`@("`@("`@(&1E=FEC=
XM92X@(`H*("`@("`@("`@()LQ;4QI;F53='EL99LP;3U;()LS;7-E="";,&U=E
XM(`H@("`@("`@("`@("`@("`@("`@()LS;4QI;F53='EL92`@FS!M;6%Y("!B?
XM92`@=7-E9"!T;R!S<&5C:69Y(&$@;&ES="!O9B!L:6YE"B`@("`@("`@("`@P
XM("`@("`@("`@<W1Y;&5S(&9O<B`@<&QO=',@('=I=&@@(&UU;'1I<&QE("!CH
XM=7)V97,N("`@($5A8V@*("`@("`@("`@("`@("`@("`@("!L:6YE<W1Y;&4@7
XM(&ES("!S<&5C:69I960@(&%S("!A("!S97%U96YC92`@;V8@('!E;@H@("`@8
XM("`@("`@("`@("`@("`@(&1O=VXN+BX@('!E;B`@=7`@(&5L96UE;G1S+B`@U
XM("!4:&4@(&5L96UE;G1S("`@87)E"B`@("`@("`@("`@("`@("`@("`@96YC6
XM;V1E9"!U<VEN9R!T:&4@9F]L;&]W:6YG(&-H87)A8W1E<G,@=&\@:6YD:6-A_
XM=&4*("`@("`@("`@("`@("`@("`@("!E;&5M96YT(&QE;F=T:',Z(`H@("`@&
XM("`@("`@("`@("`@("`@("`@("`@("`@("";,6UMFS!M.B`R-3`@;6EC<F]NW
XM(&UA<FL@"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@()LQ;4V;,&TZM
XM(#%M;2!M87)K("B;,6UM;6UMFS!M*2`*("`@("`@("`@("`@("`@("`@("`@6
XM("`@("`@("`@FS%M<YLP;3H@,C4P(&UI8W)O;B!S<&%C92`*("`@("`@("`@3
XM("`@("`@("`@("`@("`@("`@("`@FS%M4YLP;3H@,6UM('-P86-E("B;,6USI
XM<W-SFS!M*2`*("`@("`@("`@("`@("`@("`@("!&;W(@(&5X86UP;&4L("!A$
XM("!S970@(&]F("!L:6YE("!S='EL97,@(&UI9VAT("!B90H@("`@("`@("`@7
XM("`@("`@("`@(&EN9&EC871E9"`*("`@("`@("`@("`@("`@("`@("`@("`@/
XM("`@("`@3&EN95-T>6QE/7M-4RQ-35-3+$U-4VUM4RQM;5,L;6U3;6U334U3O
XM?2`*"B`@("`@("`@("";,6U/<FEE;G1A=&EO;ILP;3U;()LQ;7!O<G1R86ET4
XM()LP;7P@FS%M;&%N9'-C87!E()LP;5T@"B`@("`@("`@("`@("`@("`@("`@W
XMFS-M3W)I96YT871I;VX@FS!M8V]N=')O;',@=VAE=&AE<B!T:&4@<&QO="!IS
XM<R!D:7-P;&%Y960*("`@("`@("`@("`@("`@("`@("!I;B!L86YD<V-A<&4@>
XM;W(@<&]R=')A:70@;W)I96YT871I;VXN("`*"B`@("`@("`@("";,6U/<FEG.
XM:6Z;,&T]6R";,VUI;G1E<G9A;"";,&U\()LQ;4%U=&]M871I8R";,&U\()LQ[
XM;4UE9&EA;B";,&U=(`H@("`@("`@("`@("`@("`@("`@()LS;4]R:6=I;B";X
XM,&UA;&QO=W,@=&AE('!L86-E;65N="!O9B!A('-E="!O9B!A>&5S(&%T(&%NU
XM"B`@("`@("`@("`@("`@("`@("`@87)B:71R87)Y('!O:6YT+B`@5&AE()LSA
XM;4UE9&EA;B";,&UV86QU92!P;&%C97,@=&AE(&%X97,*("`@("`@("`@("`@$
XM("`@("`@("!A="!T:&4@;65D:6%N()LS;5@@FS!M86YD("!T:&4@(&UE9&EA#
XM;B`@FS-M62`@FS!M;V8@('1H92`@9&%T80H@("`@("`@("`@("`@("`@("`@4
XM('9A;'5E<RX@(`H*("`@("`@("`@()LQ;5!L;W1#;VQO<ILP;3U;()LS;6)O%
XM;VQE86X@FS!M72`*("`@("`@("`@("`@("`@("`@("";,VU0;&]T0V]L;W(@G
XM()LP;6EF()LQ;71R=64@FS!M8V%U<V5S('1H92!P;&]T('1O(&=E;F5R871E*
XM9"!I;@H@("`@("`@("`@("`@("`@("`@(&-O;&]R(&EF('1H:7,@9F5A='5RR
XM92!I<R!S=7!P;W)T960@;VX@82!P87)T:6-U;&%R"B`@("`@("`@("`@("`@&
XM("`@("`@;W5T<'5T(&1E=FEC92X@(`H*("`@("`@("`@()LQ;5!L;W1*;VENK
XM962;,&T]6R";,VUB;V]L96%N()LP;5T@"B`@("`@("`@("`@("`@("`@("`@S
XMFS-M4&QO=$IO:6YE9"P@FS!M:68@<V5T+"!C;VYN96-T<R!E86-H(&1A=&$@F
XM<&]I;G0@('=I=&@*("`@("`@("`@("`@("`@("`@("!A(&QI;F4@:6X@=&AEQ
XM(&-U<G)E;G0@;&EN92!S='EL92X@(`H*("`@("`@("`@()LQ;5!L;W10;VENL
XM='.;,&T]6R";,VUB;V]L96%N()LP;5T@"B`@("`@("`@("`@("`@("`@("`@1
XMFS-M4&QO=%!O:6YT<R";,&UI9B";,6UT<G5E()LP;6-A=7-E<R!S>6UB;VQS<
XM('1O(&)E('!L;W1T960@:6X*("`@("`@("`@("`@("`@("`@("!T:&4@8W5RR
XM<F5N="!S>6UB;VP@<W1Y;&4@870@96%C:"!D871A('!O:6YT+B`@"@H@("`@L
XM("`@("`@FS%M4&]I;G138V%L99LP;3U;()LS;61B;"";,&U=(`H@("`@("`@'
XM("`@("`@("`@("`@()LS;5!O:6YT4V-A;&4@()LP;6-O;G1R;VQS('1H92!RL
XM96QA=&EV92!S:7IE(&]F('1H92!D871A"B`@("`@("`@("`@("`@("`@("`@?
XM<&]I;G0@<WEM8F]L<R!W:&5N(&1A=&$@<&]I;G0@('-Y;6)O;',@(&%R92`@J
XM8F5I;F<*("`@("`@("`@("`@("`@("`@("!P;&]T=&5D+B`@"@H@("`@("`@M
XM("`@FS%M4&]I;G13>6UB;VR;,&T]6R";,6U!=71O;6%T:6,@FS!M?"";,VUS+
XM970@FS!M72`*("`@("`@("`@("`@("`@("`@("";,VU0;VEN=%-Y;6)O;"";N
XM,&US<&5C:69I97,@82!L:7-T(&]F('-Y;6)O;',@=&\@8F4@=7-E9`H@("`@8
XM("`@("`@("`@("`@("`@('=H96X@<&QO='1I;F<@(&1A=&$@<&]I;G1S+B`@(
XM5&AE('-Y;6)O;',@='EP97,@87)E"B`@("`@("`@("`@("`@("`@("`@96YCW
XM;V1E9"!A<R!I;G1E9V5R<RX@("`@*%-E92`@=&AE("";,6U03%!,3U0@()LPD
XM;6QI8G)A<GD*("`@("`@("`@("`@("`@("`@("!D;V-U;65N=&%T:6]N('1OI
XM(&9I;F0@=&AE('-Y;6)O;',@879A:6QA8FQE+BD@"@H@("`@("`@("`@FS%M0
XM4&QO=%1I=&QEFS!M/5L@*B!=(`H@("`@("`@("`@("`@("`@("`@()LS;5!L9
XM;W14:71L92`@FS!M=&%K97,@('1H92`@<&QO="`@=&ET;&4@87,@86X@87)G4
XM=6UE;G0N"B`@("`@("`@("`@("`@("`@("`@5&5X="!C;VYT<F]L("!S97%UE
XM96YC97,@(&1E<V-R:6)E9"`@86)O=F4@(&UA>2`@8F4*("`@("`@("`@("`@8
XM("`@("`@("!I;F-L=61E9"X@(`H*"@H@("`@(#4O,34O.3`@("`@("`@("`@@
XM("`@("`@("`@("`@("`@("TS+2`@("`@("`@("`@("`@("`@("!$=6ME(%5N9
XM:79E<G-I='D*"@H@("`@($QI<W10;&]T*#$I("`@("`@("`@("`@("`@("`@Z
XM04U)1T$@36%N=6%L("`@("`@("`@("`@("`@("`@3&ES=%!L;W0H,2D*"@H@8
XM("`@("`@("`@FS%M4&QO=$1E=FEC99LP;3U;FS%M86UI9V&;,&U\()LQ;7!R_
XM:6YT97(@FS!M?"";,6UI9F8@FS!M?"";,6UH<"";,&U\()LQ;6%E9VES()LPJ
XM;7P@FS%M<&]S='-C<FEP=)LP;5T@"B`@("`@("`@("`@("`@("`@("`@FS-M7
XM4&QO=$1E=FEC92";,&US<&5C:69I97,@;W5T<'5T(&1E=FEC92!T>7!E+B`@S
XM"@H@("`@("`@("`@FS%M4&QO=%1Y<&6;,&T]6R";,6UL:6YL:6X@FS!M?"";,
XM,6UL;V=L:6X@FS!M?"";,6UL:6YL;V<@FS!M?"";,6UL;V=L;V<@FS!M?"";5
XM,6UP;VQA<B";,&U=(`H@("`@("`@("`@("`@("`@("`@()LS;5!L;W14>7!E7
XM("";,&US<&5C:69I97,@=&AE()LS;6=R87!H('!A<&5R()LP;75P;VX@=VAI[
XM8V@@=&AE"B`@("`@("`@("`@("`@("`@("`@<&QO="!I<R!D<F%W;BX@(%1H7
XM92!C=7)R96YT("!I;7!L96UE;G1A=&EO;B`@<&QO=',*("`@("`@("`@("`@J
XM("`@("`@("!I;B`*("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@;&EN$
XM96%R+6QI;F5A<BP@"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(&QO1
XM9RUL:6YE87(L(`H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("!L:6YE-
XM87(M;&]G+"`*("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@;&]G+6QOB
XM9RP@86YD(`H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("!P;VQA<B`*8
XM"B`@("`@("`@("`@("`@("`@("`@9F]R;6%T<RX@("!&;W(@('1H92!L;V<@^
XM='EP92!P;&]T<RP@=&AE(&QO9R!O9B!T:&4*("`@("`@("`@("`@("`@("`@C
XM("!D871A(&ES(&-O;7!U=&5D+B`@("!&;W(@('!O;&%R("!P;&]T<RP@('-E`
XM92`@86QS;PH@("`@("`@("`@("`@("`@("`@()LS;4%N9W5L87)5;FET()LPN
XM;6%N9"";,VU0;VQA<E9A<FEA8FQE+B`*"B`@("`@("`@("";,&V;,6U0;VQA^
XM<E9A<FEA8FQEFS!M/5L@FS%M86YG;&4@FS!M?"";,6UR861I=7,@FS!M72`*<
XM("`@("`@("`@("`@("`@("`@("";,VU0;VQA<E9A<FEA8FQE("";,&UF;W(@^
XM('!O;&%R('!L;W1S(&ES('5S960@=&\@<W!E8VEF>0H@("`@("`@("`@("`@=
XM("`@("`@('=H971H97(@=&AE(&EN9&5P96YD96YT("!V87)I86)L92`@:7,@H
XM(&%N9W5L87(@(&]R"B`@("`@("`@("`@("`@("`@("`@<F%D:6%L+B`@"@H@$
XM("`@("`@("`@FS%M4F%N9V6;,&T]6R";,VUI;G1E<G9A;"";,&U\()LQ;4%LP
XM;"";,&U\()LQ;4%U=&]M871I8R";,&U=(`H@("`@("`@("`@("`@("`@("`@_
XM()LS;5)A;F=E()LP;7-P96-I9FEE<R`@('1H92`@('D@("!A>&ES("`@8F]U0
XM;F1S+B`@("`H97@N"B`@("`@("`@("`@("`@("`@("`@4F%N9V4]+3$L,2`I>
XM(%=H96X@('-E="`@=&\@()LQ;4%L;)LP;2P@(&%L;"`@<&]I;G1S("!A<F4*O
XM("`@("`@("`@("`@("`@("`@("!P;&]T=&5D+B`@(%=H96X@('-E="!T;R";F
XM,6U!=71O;6%T:6.;,&TL(&]U=&QY:6YG('!O:6YT<PH@("`@("`@("`@("`@K
XM("`@("`@(&UA>2!N;W0@8F4@<&QO='1E9"X@(`H*("`@("`@("`@()LQ;5-U>
XM8E!A9V5SFS!M/5L@FS-M:6YT97)V86P@FS!M72`*("`@("`@("`@("`@("`@A
XM("`@("";,VU3=6)086=E<R`@FS!M<W!E8VEF:65S("!T:&4@(&YU;6)E<B`@R
XM;V8@('!L;W1S("!O;B`@80H@("`@("`@("`@("`@("`@("`@('!A9V5S+B`@-
XM(%1H:7,@(&ES(&$@=F5S=&EG92!O9B!03%!,3U0@86YD($D@86T@;F]T"B`@!
XM("`@("`@("`@("`@("`@("`@<W5R92!T:&ES("!H87,@(&%N>2`@=7-E("!W?
XM:71H:6X@('1H92`@8V]N=&5X="`@;V8*("`@("`@("`@("`@("`@("`@("";<
XM,VU,:7-T4&QO="X@()LP;4ET("!M:6=H="!B92!U<V5F=6P@9F]R(&-O;G1R?
XM;VQL:6YG('1H90H@("`@("`@("`@("`@("`@("`@('-I>F4@;V8@=&AE('!L]
XM;W1S(&)U="!T:&4@FS-M5FEE=U!O<G0@FS!M;6EG:'0@8F4@82!M;W)E"B`@S
XM("`@("`@("`@("`@("`@("`@9&ER96-T('-O;'5T:6]N+B`@"@H@("`@("`@Z
XM("`@FS%M4W5P<&QY06)S8VES<V&;,&T]6R";,VUB;V]L96%N()LP;5T@"B`@Y
XM("`@("`@("`@("`@("`@("`@FS-M4W5P<&QY06)S8VES<V$@FS!M:68@<V5T$
XM(&-A=7-E<R";,VU,:7-T4&QO="";,&UT;R!S=7!P;'D@(&$*("`@("`@("`@-
XM("`@("`@("`@("!V86QU92!F;W(@=&AE(&EN9&5P96YD96YT('9A<FEA8FQE9
XM+B`@"@H@("`@("`@("`@FS%M5&ET;&538V%L99LP;3U;()LS;61B;"";,&U=W
XM(`H@("`@("`@("`@("`@("`@("`@()LS;51I=&QE4V-A;&4@FS!M8V]N=')O\
XM;',@=&AE(')E;&%T:79E('-I>F4@;V8@=&AE('1I=&QE"B`@("`@("`@("`@9
XM("`@("`@("`@=&5X="X@(`H*("`@("`@("`@()LQ;55S94EN<'5T1FEL99LPH
XM;3U;("H@72`*("`@("`@("`@("`@("`@("`@("";,VU5<V5);G!U=$9I;&4@.
XMFS!M<&5R;6ET<R!T:&4@<W!E8VEF:6-A=&EO;B!O9B!A;B!I;G!U=`H@("`@<
XM("`@("`@("`@("`@("`@(&9I;&4@:68@>6]U('=O=6QD(')A=&AE<B!N;W0@.
XM=7-E('-T9&EN+B`@"@H@("`@("`@("`@FS%M57-E3W5T<'5T1FEL99LP;3U;8
XM("H@72`*("`@("`@("`@("`@("`@("`@("";,VU5<V5/=71P=71&:6QE("";%
XM,&UP97)M:71S("!T:&4@('-P96-I9FEC871I;VX@(&]F("!A;@H@("`@("`@1
XM("`@("`@("`@("`@(&]U='!U="!F:6QE(&EF('EO=2!W;W5L9"!R871H97(@.
XM;F]T('5S92!S=&1O=70N("`*"B`@("`@("`@("";,6U697)B;W-EFS!M/5L@"
XMFS-M8F]O;&5A;B";,&U=(`H@("`@("`@("`@("`@("`@("`@()LS;59E<F)OS
XM<V4@FS!M:68@<V5T(&-A=7-E<R!E>'1E;F1E9"!M97-S86=I;F<N("`*"B`@@
XM("`@("`@("";,6U6:65W4&]R=)LP;3U;()LS;7)E8W0@FS!M72`*("`@("`@Q
XM("`@("`@("`@("`@("";,VU6:65W4&]R="";,&UA;&QO=W,@8V]N=')O;"!O5
XM=F5R('1H92!S:7IE(&]F("!A("!P;&]T+@H@("`@("`@("`@("`@("`@("`@V
XM(%1A:V5S("`@82`@('9I97=I;F<@("!R96-T86YG;&4@("!D:6%G;VYA;"`@F
XM87,@(&%N"@H*("`@("`U+S$U+SDP("`@("`@("`@("`@("`@("`@("`@("`@#
XM("`M-"T@("`@("`@("`@("`@("`@("`@1'5K92!5;FEV97)S:71Y"@H*("`@7
XM("!,:7-T4&QO="@Q*2`@("`@("`@("`@("`@("`@($%-24=!($UA;G5A;"`@:
XM("`@("`@("`@("`@("`@($QI<W10;&]T*#$I"@H*("`@("`@("`@("`@("`@[
XM("`@("!A<F=U;65N="X@(`H@("`@("`@("`@("`@("`@("`@("`@("`@("`@[
XM("!E>"X@(%9I97=0;W)T/7LP+C$L,"XS+"`P+CDL,"XV?2`*"B`@("`@("`@C
XM("";,6U83&%B96R;,&T]6R`J(%T@"B`@("`@("`@("`@("`@("`@("`@FS-MM
XM6$QA8F5L()LP;7-P96-I9FEE<R`@6"`@87AI<R`@;&%B96PN("`@(%1E>'0@+
XM(&-O;G1R;VP*("`@("`@("`@("`@("`@("`@("!S97%U96YC97,@9&5S8W)I1
XM8F5D(&%B;W9E(&UA>2!B92!I;F-L=61E9"X@(`H*("`@("`@("`@()LQ;5E,N
XM86)E;)LP;3U;("H@72`*("`@("`@("`@("`@("`@("`@("";,VU93&%B96P@I
XMFS!M<W!E8VEF:65S("!9("!A>&ES("!L86)E;"X@("`@5&5X="`@8V]N=')OI
XM;`H@("`@("`@("`@("`@("`@("`@('-E<75E;F-E<R!D97-C<FEB960@86)O9
XM=F4@;6%Y(&)E(&EN8VQU9&5D+B`@"@H@("`@("`@("`@FS%M6%1I8VN;,&T]D
XM6R";,6U!=71O;6%T:6,@FS!M?"";,VUI;G1E<G9A;"";,&U=(`H@("`@("`@N
XM("`@("`@("`@("`@()LS;5A4:6-K()LP;6-O;G1R;VQS('1H92!S<&%C:6YGP
XM(&]F(&UA:F]R(&%X:7,@=&EC:W,@86YD"B`@("`@("`@("`@("`@("`@("`@>
XM=&AE(&YU;6)E<B`@(&]F("`@;6EN;W(@("!S=6)D:79I<VEO;G,N("`@("`@4
XM("AE>"X*("`@("`@("`@("`@("`@("`@("";,VU85&EC:STP+C$L,3`@FS!ML
XM:6YD:6-A=&5S(&UA:F]R('1I8VMS(&%T('5N:71S(&]F(#`N,0H@("`@("`@!
XM("`@("`@("`@("`@('=I=&@@,3`@;6EN;W(@<W5B9&EV:7-I;VYS+BD@"@H@/
XM("`@("`@("`@FS%M651I8VN;,&T]6R";,6U!=71O;6%T:6,@FS!M?"";,VU)%
XM;G1E<G9A;"";,&U=(`H@("`@("`@("`@("`@("`@("`@()LS;5E4:6-K()LPE
XM;6-O;G1R;VQS('1H92!S<&%C:6YG(&]F(&UA:F]R(&%X:7,@=&EC:W,@86YD;
XM"B`@("`@("`@("`@("`@("`@("`@=&AE(&YU;6)E<B!O9B!M:6YO<B!S=6)D\
XM:79I<VEO;G,N("`*"B`@("`@FS%M1DE,15,@"@H@("`@($E$14Y4249)0T%4Z
XM24].(`H@("`@("`@("`@FS!M075T:&]R<SH@($9R961E<FEC:R`@4BX@($)A:
XM<G1R86T@(&%N9"!!;G1H;VYY($TN(%)I8VAA<F1S;VXL"B`@("`@("`@("!$<
XM97!T+B!O9B!%;&5C=')I8V%L($5N9VEN965R:6YG+"`@1'5K92`@56YI=F5R]
XM<VET>2P@($1U<FAA;2P*("`@("`@("`@($XN0RX@,C<W,#8N("`*("`@("`@7
XM("`@($EN=&5R3F5T.B!F<F)`9'5K964N96=R+F1U:V4N961U+&%M<D!D=6ME/
XM92YE9W(N9'5K92YE9'4@"B`@("`@("`@("!#;W!Y<FEG:'0@(#$Y.3`@(&)YE
XM("!&<F5D97)I8VL@(%(N("!"87)T<F%M("!A;F0@($%N=&AO;GD@32X*("`@Q
XM("`@("`@(%)I8VAA<F1S;VXN("`*("`@("`@("`@($%M:6=A('!O<G0@8GD@$
XM06YT:&]N>2!-+B!2:6-H87)D<V]N(`H*("`@("";,6U"54=3(`H@("`@("`@Q
XM("`@FS!M4&QE87-E(')E<&]R="!A;GD@8G5G<R!O<B!U;G5S=6%L()LS;69E[
XM871U<F5S()LP;71O('1H92!A=71H;W)S+B`@"@H*"@H*"@H*"@H*"@H*"@H*X
XM"@H*"@H*"@H*("`@("`U+S$U+SDP("`@("`@("`@("`@("`@("`@("`@("`@<
XI("`M-2T@("`@("`@("`@("`@("`@("`@1'5K92!5;FEV97)S:71Y"@H@.
X``
Xend
Xsize 13631
END_OF_FILE
if test 19126 -ne `wc -c <'docs/ListPlot.uu'`; then
echo shar: \"'docs/ListPlot.uu'\" unpacked with wrong size!
fi
# end of 'docs/ListPlot.uu'
fi
echo shar: End of archive 2 \(of 3\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 3 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.